//===========================================================================
//  FIXED POINT RELATED DEFINES
//===========================================================================

// fixed point precision
#define FPP                 60

// 1 in fixed point format
#define FP_ONE              ((FP)1 << FPP)

// maximum positive value in fixed point format
#define FP_MAX              (((FP)1 << (64 - 1)) - 1)

// minimum negative value in fixed point format
#define FP_MIN              (-((FP)1 << (64 - 1)))


//===========================================================================
//  DATA-TYPE CONVERSION MACROS
//===========================================================================

// convert integer to fixed point
#define INT2FP(x)           ((x) << FPP)

// convert fixed point to integer
#define FP2INT(x)           ((x) >> FPP)

// convert fixed point to integer with rounding
#define ROUNDFP2INT(x)      (((x) + ((FP_ONE) / 2)) >> FPP)

// convert float to fixed point
#define FLOAT2FP(x)         ((FP)(((x) * FP_ONE)))

// convert fixed point to float
#define FP2FLOAT(x)         (((double)(x)) / FP_ONE)

//===========================================================================
//  OPERATIONS
//===========================================================================

static FP FP_Mul(FP a, FP b)
{
	return ((a >> FPP/2) * (b >> FPP/2));
}

static FP FP_Cube(FP a)
{
	FP tmp = a>>40;
	return tmp*tmp*tmp;
}